#define _CRT_SECURE_NO_WARNINGS 1
#include <queue>
#include <iostream>
using namespace std;
#include <string>
#include <stack>
#include <vector>
#include <algorithm>

class Solutionxxx {
public:
    struct Node {
        int start;
        int end;
    };
    static bool comp(Node x, Node y) {
        return x.start < y.start;
    }
    bool hostschedule(vector<vector<int>>& schedule) {
        // write code here
        // 只需要遍历即可 endi <= starti
        // 将时间进行排序
        // 存储在一个数据结构中
        vector<Node> v;
        for (auto e : schedule) {
            Node n;
            n.end = e[1], n.start = e[0];
            v.push_back(n);
        }
        sort(v.begin(), v.end(), comp);
        for (int i = 0; i < v.size() - 1; i++)
            if (v[i].end > v[i + 1].start) return false;

        return true;
    }
};

class Solutionxx {
public:
    void moveZeroes(vector<int>& nums) {
        if (nums.size() <= 1)
            return;
        int cur = 0, des = -1;
        int len = nums.size();
        while (cur < len) {
            if (nums[cur] == 0) {
                cur++;
            }
            else {
                swap(nums[cur], nums[des + 1]);
                des++, cur++;
            }
        }
        return;
    }
};

bool isPrime(int n) {
    if (n == 2) return true;
    int x = max(n / 2, 2);
    for (int i = 0; i < x; i++)
        if (n % x == 0)
            return false;
    return true;
}


//int main() {
//    int num;
//    cin >> num;
//    vector<int> v(num);
//    int sum = 0;
//    for (auto& e : v) cin >> e, sum += e;
//    sort(v.begin(), v.end());
//    int sumcount = 0;
//    int flag = 0;
//    for (int i = 0; i < num - 1; i++) {
//        sumcount += v[i];
//        if (sumcount * 2 == sum) {
//            flag = 1;
//            break;
//        }
//    }
//    if (flag) cout << "true" << endl;
//    else cout << "false" << endl;
//    return 0;
//}

//int main() {
//    string s;
//    cin >> s;
//    // 统计词出现的数目
//    int min = 100, max = -1;
//    sort(s.begin(), s.end());
//    char ch;
//    int count = 0;
//
//    vector<stack<char>> vs;
//    for (int i = 0; i < s.size(); i++) {
//        if (vs.empty()) {
//            stack<char> st;
//            st.push(s[i]);
//            vs.push_back(st);
//            continue;
//        }
//        if (s[i] == vs[vs.size() - 1].top()) {
//            vs[vs.size() - 1].push(s[i]);
//        }
//        else {
//            stack<char> st;
//            st.push(s[i]);
//            vs.push_back(st);
//        }
//    }
//
//    for (auto& e : vs) {
//        if (max < (int)e.size()) max = e.size();
//        if (min > e.size()) min = e.size();
//    }
//    int c = abs(max - min);
//    if (isPrime(c)) {
//        cout << "Lucky Word" << endl;
//        cout << c << endl;
//    }
//    else {
//        cout << "No Answer" << endl;
//        cout << c << endl;
//    }
//    return 0;
//}
class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<float> pq;
        float sum = 0;
        for (auto e : nums)
            pq.push(e), sum += e;
        float cpsum = sum;
        float cmp = sum / 2;
        int cnt = 0;
        while (cpsum > cmp) {
            float e = pq.top();
            pq.pop();
            e = e / 2;
            cpsum -= e;
            pq.push(e);
            cnt++;
        }
        return cnt;
    }
};

int main() {
    vector<int> v({ 5,19,8,1 });
    Solution s;
    s.halveArray(v);
    return 0;
}